# -*- coding: utf-8 -*-

"""
@Datetime: 2018/8/17
@Author: Zhang Yafei
"""
"""
1. 介绍hashlib
　　hashlib 是一个提供了一些流行的hash算法的 Python 标准库．其中所包括的算法有 md5, sha1, sha224, sha256, 
sha384, sha512. 另外，模块中所定义的 new(name, string=”) 方法可通过指定系统所支持的hash算法来构造相应的hash
对象．
a. 各hash算法的使用示例
b. 一个 md5 的使用示例
c. 使用 new(name, string=”) 构造新的哈系对象
"""

import hashlib
from hashlib import md5, sha1, sha224, sha256, sha384, sha512
from pprint import pprint

hash_funcs = [md5, sha1, sha224, sha256, sha384, sha512]


def hash_show(s):
    result = []
    for func in hash_funcs:
        s_hash_obj = func(s.encode())
        s_hash_hex = s_hash_obj.hexdigest()
        result.append((s_hash_obj.name, s_hash_hex, len(s_hash_hex)))
    return result


if __name__ == '__main__':
    # 1.各hashlib算法的使用案例
    s = 'hello python'
    rs = hash_show(s)
    pprint(rs)
    # 2.md5的使用案例
    m1 = md5()  # 构造hash对象
    m1.update('hello'.encode())
    m1.update(' '.encode())
    m1.update('python'.encode())
    m2 = md5('hello python'.encode())
    print(m1.hexdigest() == m2.hexdigest())  # 两种方式的效果相同
    # 3.使用 new(name, string=”) 构造新的哈系对象
    h = hashlib.new('ripemd160', 'hello python'.encode())  # ripemd160是一个160位的hash算法. ripemd系列算法基于md4, md5.
    print(h.hexdigest(), len(h.hexdigest()))
